﻿/***************************************************************
 * 开发人员：网魂小兵@http://www.mozlite.com
 * 
 * 用户信息基类，包含了重要信息。
 * 
 * 最后修改：2011-10-28
 * ************************************************************/
namespace Mozlite.Common
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using Mozlite.Cryptography;
    using Mozlite.Common.Configuration;

    /// <summary>
    /// 用户信息基类。
    /// </summary>
    public abstract class BaseUserInfo : BaseObject
    {
        #region initializer
        /// <summary>
        /// 初始化<see cref="T:Mozlite.Common.BaseUserInfo"/>。
        /// </summary>
        public BaseUserInfo()
        {
            this.TimeZone = SiteSettings.Current.TimeZone;
        }

        /// <summary>
        /// 从数据库中加载数据。
        /// </summary>
        /// <param name="reader">数据库读取器。</param>
        protected override void Load(IDataReader reader)
        {
            this.UserID = reader.GetInt32("UserID");
            this.UserName = reader.GetString("UserName");
            this.Password = reader.GetString("Password");
            this.Email = reader.GetString("Email");
            this.EncryptType = reader.TGet<EncryptionAlgorithm>("EncryptType");
            this.PasswordQuestion = reader.GetString("PasswordQuestion");
            this.PasswordAnswer = reader.GetString("PasswordAnswer");
            this.AccountStatus = reader.TGet<AccountStatus>("AccountStatus");
            this.PasswordSalt = reader.GetString("PasswordSalt");
            this.LastLockoutDate = reader.GetDateTime("LastLockoutDate");
            this.LastLoginDate = reader.GetDateTime("LastLoginDate");
            this.IsAnonymous = reader.GetBoolean("IsAnonymous");
            this.CreateDate = reader.GetDateTime("CreateDate");
            this.CreateIP = reader.GetString("CreateIP");
            this.LastLoginIP = reader.GetString("LastLoginIP");
            this.LastActiveDate = reader.GetDateTime("LastActiveDate");
            this.LastPasswordChangedDate = reader.GetDateTime("LastPasswordChangedDate");
            this.FailedPasswordAnswerAttemptCount = reader.GetInt32("FailedPasswordAnswerAttemptCount");
            this.FailedPasswordAnswerAttemptWindowStart = reader.GetDateTime("FailedPasswordAnswerAttemptWindowStart");
            this.FailedPasswordAttemptCount = reader.GetInt32("FailedPasswordAttemptCount");
            this.FailedPasswordAttemptWindowStart = reader.GetDateTime("FailedPasswordAttemptWindowStart");
            this.BannedUntil = reader.GetDateTime("BannedUntil");
            this.BannedReason = reader.TGet<BannedReason>("BannedReason");
            this.TimeZone = reader.GetString("TimeZone");
            this.SingleLoginMarkCode = reader.GetString("SingleLoginMarkCode");
            this.IsGlobalAdministrator = reader.GetBoolean("IsGlobalAdministrator");
        }
        #endregion

        #region properties
        /// <summary>
        /// 获取或设置用户ID。
        /// </summary>
        public int UserID { get; set; }
        /// <summary>
        /// 获取或设置用户名称。
        /// </summary>
        public string UserName { get; set; }
        /// <summary>
        /// 获取或设置用户密码。
        /// </summary>
        public string Password { get; set; }
        /// <summary>
        /// 获取或设置用户的电子邮件。
        /// </summary>
        public string Email { get; set; }
        /// <summary>
        /// 获取或设置安全密码问题。
        /// </summary>
        public string PasswordQuestion { get; set; }
        /// <summary>
        /// 获取或设置安全问题答案。
        /// </summary>
        public string PasswordAnswer { get; set; }
        /// <summary>
        /// 获取或设置用户状态值。
        /// </summary>
        public AccountStatus AccountStatus { get; set; }
        /// <summary>
        /// 获取或设置安全信息的加密类型。
        /// </summary>
        public EncryptionAlgorithm EncryptType { get; set; }
        /// <summary>
        /// 获取或设置密码密钥。
        /// </summary>
        public string PasswordSalt { get; set; }
        /// <summary>
        /// 获取或设置最后锁定日期。
        /// </summary>
        public DateTime LastLockoutDate { get; set; }
        /// <summary>
        /// 获取或设置最后登录日期。
        /// </summary>
        public DateTime LastLoginDate { get; set; }
        /// <summary>
        /// 获取或设置最后密码更新日期。
        /// </summary>
        public DateTime LastPasswordChangedDate { get; set; }
        /// <summary>
        /// 获取或设置创建日期。
        /// </summary>
        public DateTime CreateDate { get; set; }
        /// <summary>
        /// 获取或设置是否匿名用户。
        /// </summary>
        public bool IsAnonymous { get; set; }
        /// <summary>
        /// 获取或设置尝试密码登录错误次数。
        /// </summary>
        public int FailedPasswordAttemptCount { get; set; }
        /// <summary>
        /// 获取或设置尝试密码登录错误的起始日期。
        /// </summary>
        public DateTime FailedPasswordAttemptWindowStart { get; set; }
        /// <summary>
        /// 获取或设置尝试密码问题答案错误次数。
        /// </summary>
        public int FailedPasswordAnswerAttemptCount { get; set; }
        /// <summary>
        /// 获取或设置尝试密码问题登录错误的起始日期。
        /// </summary>
        public DateTime FailedPasswordAnswerAttemptWindowStart { get; set; }
        /// <summary>
        /// 获取或设置创建帐号的IP。
        /// </summary>
        public string CreateIP { get; set; }
        /// <summary>
        /// 获取或设置最后登录IP。
        /// </summary>
        public string LastLoginIP { get; set; }
        /// <summary>
        /// 最后活动时间。
        /// </summary>
        public DateTime LastActiveDate { get; set; }
        /// <summary>
        /// 获取或设置禁号到期时间。
        /// </summary>
        public DateTime BannedUntil
        {
            get;
            set;
        }
        /// <summary>
        /// 获取或设置账号被禁原因。
        /// </summary>
        public BannedReason BannedReason
        {
            get;
            set;
        }
        /// <summary>
        /// 获取或设置时区。
        /// </summary>
        public string TimeZone { get; set; }
        /// <summary>
        /// 用于判断只能一个用户登录才生效，和QQ提示异地登录效果一样。
        /// </summary>
        public string SingleLoginMarkCode { get; set; }
        /// <summary>
        /// 是否为跨站管理员，即可以管理所有站点。
        /// </summary>
        public bool IsGlobalAdministrator { get; set; }
        #endregion

        #region helpers
        /// <summary>
        /// 获取是否通过验证。
        /// </summary>
        public bool IsApproved { get { return this.AccountStatus == AccountStatus.Approved; } }
        /// <summary>
        /// 获取当前帐号是否被锁定。
        /// </summary>
        public bool IsLockedOut { get { return this.AccountStatus == AccountStatus.Banned; } }
        #endregion
    }
}
